
// 组合继承（也叫伪经典继承）：组合构造函数继承和原型链继承
// 构造函数模式用于定义实例属性，而原型模式用于定义方法和共享属性。
// 优点：融合了构造函数继承和原型链继承的优点
// 缺点：调用了2次父类构造函数

function Parent(name){
    this.name = name || 'parentName';
}
Parent.prototype.sleep = function(){
    console.log('parent sleep');
}

function Child(age){
    Parent.call(this); // 构造函数继承
    this.age = age;
}

let child1 = new Child(10);
console.log(child1); // { name: 'parentName', age: 10 }
console.log(child1.sleep); // undefined (因为还没有使用原型链继承所以父类的原型方法不能用)

// 使用原型链继承
Child.prototype = new Parent();
// 修复构造函数指向
Child.prototype.constructor = Child;
let child2 = new Child(11);
console.log(child2); // { name: 'parentName', age: 11 }
console.log(child2.sleep()); // parent sleep

